package com.reus.core.util.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * description:
 * copyright: Copyright (c) 2018-2021
 * company: iSysCore Tech. Co., Ltd.
 *
 * @author liuxq@isyscore.com
 * @version 1.0
 * @date 2021-10-11 14:50:29
 */
public class MyInvocationHandler<T> implements InvocationHandler {

    private T target;

    /**
     * description: 构造方法
     *
     * @param target: 目标对象
     * @modified liuxq@isyscore.com
     * @date 2021-10-11
     * @return:
     */
    public MyInvocationHandler(T target) {
        super();
        this.target = target;
    }


    /**
     * description: 执行目标对象方法
     *
     * @param proxy:
     * @param method: 目标对象方法
     * @param args:   目标对象方法的参数
     * @modified liuxq@isyscore.com
     * @date 2021-10-11
     * @return: java.lang.Object
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 在目标对象的方法执行之前简单的打印一下
        System.out.println("------------------before------------------");

        // 执行目标对象的方法
        Object result = method.invoke(target, args);

        // 在目标对象的方法执行之后简单的打印一下
        System.out.println("-------------------after------------------");

        return result;
    }

    /**
     * description: 获取target的代理对象
     *
     * @modified liuxq@isyscore.com
     * @date 2021-10-11
     * @return: T
     */
    public T getProxy() {
        return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                target.getClass().getInterfaces(), this);
    }
}
